package cn.lgs.com.mobileplayer.http;

import android.app.ProgressDialog;
import android.content.Context;

import java.net.ConnectException;
import java.net.SocketTimeoutException;

import retrofit2.HttpException;
import rx.Subscriber;

/**
 * 请求网络时，在请求前，请求后都有对应的操作，在发起请求的前，
 * 首先我们需要检查是否有网络，没有就告诉用户，并且不发起请求，
 * 否则，就显示一个对话框告诉用户正在进行加载数据，请求完成后，对话框消失，
 * 如果成功，则把数据回调，否则弹出失败的原因
 * Created by lgs on 2017/12/10.
 * 网络请求的操作
 */

public abstract class RxSubscribe<T> extends Subscriber<T> {

    private Context mContext;
    private ProgressDialog dialog;

    //是否显示对话框
    private boolean isShowDialog;

    public RxSubscribe(Context context, boolean isShowDialog) {
        this.mContext = context;
        this.isShowDialog = isShowDialog;
    }

    @Override
    public void onCompleted() {
        if (!isShowDialog) {
            unsubscribe();
        }
        if (null != dialog && isShowDialog) {
            dialog.dismiss();
        }
        dialog = null;
    }

    @Override
    public void onStart() {
        if (NetCheckUtils.isNetworkConnected(mContext)) {
            if (!isUnsubscribed()) {
                unsubscribe();
            }
            _onError("网络不可用");
        } else {
            if (null != dialog && isShowDialog) {
                dialog = new ProgressDialog(mContext);
                dialog.setMessage("正在加载中...");
                dialog.show();
            }
        }
    }

    @Override
    public void onNext(T t) {
        _onNext(t);
    }

    public void onError(Throwable e) {
        e.printStackTrace();
        if (!NetCheckUtils.isNetworkConnected(mContext)) {
            _onError("网络不可用");
        } else if (e instanceof SocketTimeoutException
                || e instanceof ConnectException) {
            _onError("请求超时,请稍后再试");
        } else if (e instanceof HttpException) {
            _onError("服务器异常,请稍后再试");
        } else {
            _onError("请求超时,请稍后再试");
            _onError(e.getMessage());
        }
        if (null != dialog && isShowDialog) {
            dialog.dismiss();
        }
        dialog = null;
    }

    protected abstract void _onError(String msg);

    protected abstract void _onNext(T t);
}
